package web;

import java.io.Serializable;

import org.apache.wicket.Component;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.Link;

import persistence.utilisateur.Client;
import persistence.utilisateur.Fournisseur;
import persistence.utilisateur.Gestionnaire;
import persistence.utilisateur.Utilisateur;


import web.appeloffre.ConsulterAppelOffre;
import web.appeloffre.FaireAppelOffre;
import web.login.Inscription;
import web.login.Login;
import web.login.LoginGestionnaire;
import web.offreproduit.FaireOffreProduit;
import web.offreproduit.ListeOffresFournisseur;
import web.offreproduit.ListeOffresGestionnaire;
import web.panier.ConsulterPanier;
import web.produitcatalogue.FaireProduitCatalogue;
import business.UtilisateurSession;

public abstract class Template extends WebPage implements Serializable{

	protected AjaxLink<Object> lienInscription;
	protected Label labelInscription;

	protected AjaxLink<Object> lienLogin;
	protected AjaxLink<Object> lienGestionnaire;
	protected AjaxLink<Object> lienOffreDeProduit;
	protected AjaxLink<Object> lienFaireProduit;
	protected AjaxLink<Object> lienPanier;
	// Lien vers la liste des Offres d'un fournisseur
	protected AjaxLink<Object> lienListeOffrePourFournisseur;
	// Lien vers la liste des offres non validées de tous les fournisseur
	protected AjaxLink<Object> lienListeOffrePourGestionnaire;
	// Lien accueil
	protected AjaxLink<Object> lienAccueil;
	// Lien création appel offre
	protected AjaxLink<Object> lienCreaAppelOffre;
	// Lien consultation appel offre
	protected AjaxLink<Object> lienConsulAppelOffre;

	public static final String VALEUR_LIEN_INSCRIPTION = "S'inscrire";
	public static final String VALEUR_LIEN_IDENTIFIER = "S'identifier";
	public static final String VALEUR_SE_DECONNECTER = "Se déconnecter";
	public static final String VALEUR_LIEN_GESTIONNAIRE = "Connexion en tant que gestionnaire";
	public static final String VALEUR_LIEN_OFFRE_PRODUIT = "Créer une offre de produit";
	public static final String VALEUR_LIEN_FAIRE_PRODUIT = "Créer un produit";
	public static final String VALEUR_LIEN_LISTE_OFFRE_FOURNISSEUR ="Consulter vos offres de produit";
	public static final String VALEUR_LIEN_LISTE_OFFRE_GESTIONNAIRE ="Consulter les offres fournisseur en cours";
	public static final String VALEUR_LIEN_PANIER = "Consulter votre panier";
	public static final String VALEUR_LIEN_ACCUEIL = "Accueil";
	public static final String VALEUR_LIEN_FAIRE_APPEL_OFFRE = "Créer un appel d'offre";
	public static final String VALEUR_LIEN_CONSULTATION_APPEL_OFFRE = "Consulter les appels d'offres";

	public Template() 
	{
		// On associe la clé "inscription" à un lien Ajax vers la page
		// inscription
		final Utilisateur currentUser = getMySession().getUtilisateur();		
		// Ajout des liens
		lienInscription = new AjaxLink<Object>("inscription")
				{
			public void onClick(AjaxRequestTarget target)
			{
				setResponsePage(new Inscription("Veuillez choisir votre statut d'inscription."));
			}
				};
				lienLogin = new AjaxLink<Object>("login"){
					public void onClick(AjaxRequestTarget target)
					{
						if(currentUser == null){
							setResponsePage(new Login());
						}
						else{
							getMySession().clearMySession();
							setResponsePage(new HomePage("Accueil"));
						}
					}
				};
				lienGestionnaire = new AjaxLink<Object>("gestionnaire"){
					public void onClick(AjaxRequestTarget target)
					{
						if(currentUser == null){
							setResponsePage(new LoginGestionnaire());
						}
					}
				};
				
				lienOffreDeProduit = new AjaxLink<Object>("offreproduit"){
					public void onClick(AjaxRequestTarget target)
					{
						if(currentUser instanceof Fournisseur)
						{
							setResponsePage(new FaireOffreProduit());
						}
					}
				};
				
				lienFaireProduit = new AjaxLink<Object>("faireproduit"){
					public void onClick(AjaxRequestTarget target)
					{
						if(currentUser instanceof Gestionnaire)
						{
							setResponsePage(new FaireProduitCatalogue());
						}
					}
				};
				lienListeOffrePourFournisseur = new AjaxLink<Object>("listeoffrefournisseur"){
					public void onClick(AjaxRequestTarget target)
					{
						if(currentUser instanceof Fournisseur)
						{
							setResponsePage(new ListeOffresFournisseur((Fournisseur) getMySession().getUtilisateur()));
						}
					}
				};
				lienListeOffrePourGestionnaire = new AjaxLink<Object>("listeoffregestionnaire"){
					public void onClick(AjaxRequestTarget target)
					{
						if(currentUser instanceof Gestionnaire)
						{
							setResponsePage(new ListeOffresGestionnaire());
						}
					}
				};
				
				lienPanier = new AjaxLink<Object>("panier"){
					public void onClick(AjaxRequestTarget target)
					{
						if(currentUser instanceof Client)
						{
							setResponsePage(new ConsulterPanier());
						}
					}
				};
				
				lienAccueil = new AjaxLink<Object>("accueil") {
					public void onClick(AjaxRequestTarget target)
					{
						setResponsePage(new HomePage("Accueil"));
					}
				};
				
				lienCreaAppelOffre = new AjaxLink<Object>("faireappeloffre") {
					public void onClick(AjaxRequestTarget target)
					{
						setResponsePage(new FaireAppelOffre());
					}
				};
				
				lienConsulAppelOffre = new AjaxLink<Object>("consulappeloffre")
						{
					public void onClick(AjaxRequestTarget target)
					{
						setResponsePage(new ConsulterAppelOffre());
					}
						};


				// Lien de connexion du gestionnaire
				add(lienGestionnaire.add(new Label("liengestionnaire", VALEUR_LIEN_GESTIONNAIRE)));
				// Autres (inscription, deconnexion, login)
				add(lienInscription.add(new Label("lienconnexion", VALEUR_LIEN_INSCRIPTION)));
				add(lienLogin.add(new Label("liendeconnexion", currentUser!= null ?VALEUR_SE_DECONNECTER : VALEUR_LIEN_IDENTIFIER)));		// Ajout des labels
				labelInscription = new Label("labelInscription",currentUser!= null ?currentUser.affichage() : "" );
				add(labelInscription);
				add(lienOffreDeProduit.add(new Label("lienoffreproduit", VALEUR_LIEN_OFFRE_PRODUIT)));
				add(lienFaireProduit.add(new Label("lienfaireproduit", VALEUR_LIEN_FAIRE_PRODUIT)));
				add(lienListeOffrePourFournisseur.add(new Label("lienlisteoffrefournisseur", VALEUR_LIEN_LISTE_OFFRE_FOURNISSEUR)));
				add(lienListeOffrePourGestionnaire.add(new Label("lienlisteoffregestionnaire", VALEUR_LIEN_LISTE_OFFRE_GESTIONNAIRE)));
				add(lienPanier.add(new Label("lienpanier", VALEUR_LIEN_PANIER)));
				add(lienAccueil.add(new Label("lienaccueil", VALEUR_LIEN_ACCUEIL)));
				add(lienCreaAppelOffre.add(new Label("lienfaireappeloffre", VALEUR_LIEN_FAIRE_APPEL_OFFRE)));
				add(lienConsulAppelOffre.add(new Label("lienconsulappeloffre", VALEUR_LIEN_CONSULTATION_APPEL_OFFRE)));
				
				// Gestion de la visibilité
				lienInscription.setVisible(currentUser == null);
				lienGestionnaire.setVisible(currentUser == null);
				labelInscription.setVisible(!lienInscription.isVisible());
				lienOffreDeProduit.setVisible(currentUser != null && (currentUser instanceof Fournisseur));
				lienFaireProduit.setVisible(currentUser != null && (currentUser instanceof Gestionnaire));
				lienListeOffrePourFournisseur.setVisible(currentUser != null && (currentUser instanceof Fournisseur));
				lienListeOffrePourGestionnaire.setVisible(currentUser != null && (currentUser instanceof Gestionnaire));
				lienPanier.setVisible(currentUser != null && (currentUser instanceof Client));
				lienCreaAppelOffre.setVisible(currentUser != null && (currentUser instanceof Gestionnaire));
				lienConsulAppelOffre.setVisible(currentUser != null && ((currentUser instanceof Fournisseur) || (currentUser instanceof Gestionnaire)));
	}


	/**
	 * Classe permettant de retourner la session dans Template, ainsi que toutes
	 * les pages qui héritent de Template.
	 * La session est caster en UtilisateurSession qui a été créé pour l'application
	 * @return
	 */
	public UtilisateurSession getMySession()
	{
		return (UtilisateurSession)getSession();
	}
}
